package com.wwj.aicodemother.service;

import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.service.IService;
import com.wwj.aicodemother.exception.BusinessException;
import com.wwj.aicodemother.model.dto.user.UserQueryRequest;
import com.wwj.aicodemother.model.entity.User;
import com.wwj.aicodemother.model.vo.LoginUserVO;
import com.wwj.aicodemother.model.vo.UserVO;
import jakarta.servlet.http.HttpServletRequest;

import java.util.List;

/**
 * 用户 服务层。
 *
 * @author <a href="https://gitee.com/gnemniat">Gnemnait</a>
 */
public interface UserService extends IService<User> {
    /**
     * 用户注册方法
     *
     * @param userAccount 用户账号
     * @param username    用户名
     * @param password    密码
     * @return 返回值类型为long，可能是表示注册结果的标识符或用户ID
     */
    public long userRegister(String userAccount, String username, String password);

    /**
     * 加密用户密码的方法
     *
     * @param userPassword 用户输入的原始密码
     * @return 加密后的密码字符串
     */
    public String getEncryptPassword(String userPassword);

    /**
     * 用户信息脱敏
     *
     * @param user 用户实体对象，包含用户的完整信息
     * @return LoginUserVO 登录用户视图对象，可能包含用于前端展示的脱敏后用户信息
     */
    public LoginUserVO getLoginUserVO(User user);

    /**
     * 用户登录方法
     *
     * @param userAccount  用户账号
     * @param userPassword 用户密码
     * @param request      HTTP请求对象，用于获取请求相关信息
     * @return LoginUserVO 登录成功后返回的用户视图对象，包含用户基本信息
     */
    public LoginUserVO userLogin(String userAccount, String userPassword, HttpServletRequest request);

    /**
     * 根据HTTP请求获取登录用户信息的方法
     *
     * @param request HttpServletRequest对象，包含当前HTTP请求的所有信息
     * @return User 返回当前登录的用户对象，如果用户未登录则可能返回null
     */
    public User getLoginUser(HttpServletRequest request);

    /**
     * 用户登出方法
     * 该方法用于处理用户的登出请求，清除用户会话信息
     *
     * @param request HttpServletRequest对象，包含请求相关信息
     */
    boolean userLogout(HttpServletRequest request);

    /**
     * 根据User对象获取对应的UserVO对象
     * @param user 用户实体对象
     * @return 返回转换后的UserVO对象，如果输入为null则返回null
     */
    UserVO getUserVO(User user);

    /**
     * 将User列表转换为UserVO列表
     * @param userList 用户实体列表
     * @return 用户视图对象列表
     */
    List<UserVO> getUserVOList(List<User> userList);

    /**
     * 根据用户查询请求条件构建查询包装器
     * @param userQueryRequest 用户查询请求对象，包含查询条件
     * @return 返回构建好的QueryWrapper对象，用于数据库查询
     * @throws BusinessException 当请求参数为空时抛出业务异常
     */
    QueryWrapper getQueryWrapper(UserQueryRequest userQueryRequest);
}
